#!/usr/bin/python
# -*- coding: iso-8859-1 -*-

from math import *
import sys
from csv import *

global kddcupContinuousNames
kddcupContinuousNames = [\
                        'duration', \
                        'src_bytes', \
                        'dst_bytes', \
                        'wrong_fragment', \
                        'urgent', \
                        'hot', \
                        'num_failed_logins', \
                        'num_compromised', \
                        #'root_shell', \
                        #'su_attempted', \
                        'num_root', \
                        'num_file_creations', \
                        'num_shells', \
                        'num_access_files', \
                        'num_outbound_cmds', \
                        'count', \
                        'srv_count', \
                        'serror_rate', \
                        'srv_serror_rate', \
                        'same_srv_rate', \
                        'rerror_rate', \
                        'srv_rerror_rate', \
                        'diff_srv_rate', \
                        'srv_diff_host_rate', \
                        'dst_host_count', \
                        'dst_host_srv_count', \
                        'dst_host_same_srv_rate', \
                        'dst_host_diff_srv_rate', \
                        'dst_host_same_src_port_rate', \
                        'dst_host_srv_diff_host_rate', \
                        'dst_host_serror_rate', \
                        'dst_host_srv_serror_rate', \
                        'dst_host_rerror_rate', \
                        'dst_host_srv_rerror_rate']

#global wektorSrednich
#wektorSrednich = [0.0 for i in range(len(kddcupContinuousNames))]


def anomaly():

    if len(sys.argv) == 4:

        if sys.argv[1]:
            daneUczace = sys.argv[1]

        if sys.argv[2]:
            daneDoAnalizy = sys.argv[2]

        if sys.argv[3] == "testChi":
            przedzialChi(daneDoAnalizy,daneUczace)

        elif sys.argv[3] == "testT":
            przedzialT(daneDoAnalizy,daneUczace)
        else:
            pass
    else:
        print "Zle parametry wywolania!\nPoprawne:\ndaneUczece daneDoAnalizy nazwaTestu\nlub\ndaneUczace daneUczace nazwaTestu"


def testT(daneDoAnalizy, wektorSrednich, pu, pt):

    plik = daneDoAnalizy

    try:
        in_stream = open(plik, 'r')
    except:
        print "Ostrzezenie!", "Zle zrodlo danych uczacych!\nWprowadz ponownie."

    czytaj = DictReader(in_stream, delimiter = ',')

    wektorSrednich = [0.0 for i in range(len(kddcupContinuousNames))]
    k = 0
    for pole in kddcupContinuousNames:
        r = 0
        for rekord in czytaj:
            r += 1
            if float(max(rekord[pole])) != 0.0:
                wektorSrednich[k] += float(rekord[pole])/float(max(rekord[pole]))
                #wektorSrednich[k] += float(rekord[pole])
            else:
                wektorSrednich[k] += float(rekord[pole])
        in_stream = open(plik, 'r')
        czytaj = DictReader(in_stream, delimiter = ',')
        wektorSrednich[k] /= float(r)
        k += 1

    estMacierzyKowariancji = 0.0
    s = 0
    for rekord in czytaj:
        k = 0
        suma = 0.0
        for pole in kddcupContinuousNames:
            if float(max(rekord[pole])) != 0.0:
                suma += (float(rekord[pole])/float(max(rekord[pole])) - wektorSrednich[k])**2
                #suma += (float(rekord[pole]) - wektorSrednich[k])**2
            else:
                suma += (float(rekord[pole]) - wektorSrednich[k])**2
            k += 1
        estMacierzyKowariancji += suma
        s += 1
    estMacierzyKowariancji /= float(s-1)


    in_stream = open(plik, 'r')
    czytaj = DictReader(in_stream, delimiter = ',')

    i = 1
    for rekord in czytaj:
        odlegloscT = 0.0
        k = 0
        for pole in kddcupContinuousNames:
            if float(max(rekord[pole])) != 0.0:
                odlegloscT += (float(rekord[pole])/float(max(rekord[pole])) - wektorSrednich[k])**2
                #odlegloscT += (float(rekord[pole]) - wektorSrednich[k])**2
            else:
                odlegloscT += (float(rekord[pole]) - wektorSrednich[k])**2
            k += 1
        if estMacierzyKowariancji != 0:
            odlegloscT /= float(estMacierzyKowariancji)

        i += 1
        #print str(i)+",", str(rekord['signature'][:-1])+",", str(odlegloscT)+",", "stat-T, analizowane"
        if str(rekord['signature'][:-1]) == "normal":
            b = 0
        else:
            b = 1
        print i, odlegloscT, b, pu, pt

    in_stream.close


def testChi(daneDoAnalizy, wektorSrednich, wektorWariancji, pu, pt):

    plik = daneDoAnalizy

    try:
        in_stream = open(plik, 'r')
    except:
        print "Ostrzezenie!", "Zle zrodlo danych uczacych!\nWprowadz ponownie."

    czytaj = DictReader(in_stream, delimiter = ',')

    wektorSrednich = [0.0 for i in range(len(kddcupContinuousNames))]
    k = 0
    for pole in kddcupContinuousNames:
        r = 0
        for rekord in czytaj:
            r += 1
            if float(max(rekord[pole])) != 0.0:
                wektorSrednich[k] += float(rekord[pole])/float(max(rekord[pole]))
            else:
                wektorSrednich[k] += float(rekord[pole])
        in_stream = open(plik, 'r')
        czytaj = DictReader(in_stream, delimiter = ',')
        wektorSrednich[k] /= float(r)
        k += 1


    i = 1
    for rekord in czytaj:
        odlegloscChi = 0.0
        k = 0
        for pole in kddcupContinuousNames:
            if wektorWariancji[k] != 0:
                if float(max(rekord[pole])) != 0.0:
                    odlegloscChi += ((float(rekord[pole])/float(max(rekord[pole])) - wektorSrednich[k])**2)/float(wektorWariancji[k])
                else:
                    odlegloscChi += ((float(rekord[pole]) - wektorSrednich[k])**2)/float(wektorWariancji[k])
            k += 1

        i += 1
        if str(rekord['signature'][:-1]) == "normal":
            b = 0
        else:
            b = 1
        print i, odlegloscChi, b, pu, pt

    in_stream.close


def przedzialChi(daneDoAnalizy, daneUczace):

    plik = daneUczace

    try:
        in_stream = open(plik, 'r')
    except:
        print "Ostrzezenie!", "Zle zrodlo danych uczacych!\nWprowadz ponownie."

    czytaj = DictReader(in_stream, delimiter = ',')

    wektorSrednich = [0.0 for i in range(len(kddcupContinuousNames))]
    k = 0
    for pole in kddcupContinuousNames:
        r = 0
        for rekord in czytaj:
            r += 1
            if float(max(rekord[pole])) != 0.0:
                wektorSrednich[k] += float(rekord[pole])/float(max(rekord[pole]))
            else:
                wektorSrednich[k] += float(rekord[pole])
        in_stream = open(plik, 'r')
        czytaj = DictReader(in_stream, delimiter = ',')
        wektorSrednich[k] /= float(r)
        k += 1

    #print wektorSrednich

    wektorWariancji = [0.0 for i in range(len(kddcupContinuousNames))]
    k = 0
    for pole in kddcupContinuousNames:
        r = 0
        for rekord in czytaj:
            r += 1
            if float(max(rekord[pole])) != 0.0:
                wektorWariancji[k] += (float(rekord[pole])/float(max(rekord[pole])) - wektorSrednich[k])**2
            else:
                wektorWariancji[k] += (float(rekord[pole]) - wektorSrednich[k])**2
        in_stream = open(plik, 'r')
        czytaj = DictReader(in_stream, delimiter = ',')
        wektorWariancji[k] /= float(r)
        k += 1

    listaOdleglosciChi = []
    r = 0
    s = 0
    for rekord in czytaj:
        odlegloscChi = 0.0
        k = 0
        for pole in kddcupContinuousNames:
            if wektorWariancji[k] != 0:
                if float(max(rekord[pole])) != 0.0:
                    odlegloscChi += ((float(rekord[pole])/float(max(rekord[pole])) - wektorSrednich[k])**2)/float(wektorWariancji[k])
                else:
                    odlegloscChi += ((float(rekord[pole]) - wektorSrednich[k])**2)/float(wektorWariancji[k])
            k += 1
        listaOdleglosciChi += [odlegloscChi]
        s += 1
        #print str(s)+",", str(rekord["signature"][:-1])+",", str(listaOdleglosciChi[r])+",", "stat-Chi, uczace"
        r += 1
    #print '\n\n'

    #print listaOdleglosciChi

    sredniaZodleglosciChi = 0.0
    for odleglosc in listaOdleglosciChi:
        sredniaZodleglosciChi += odleglosc

    sredniaZodleglosciChi /= float(len(listaOdleglosciChi))

    #print sredniaZodleglosciChi

    estWariancji = 0.0
    for odleglosc in listaOdleglosciChi:
        estWariancji += (odleglosc - sredniaZodleglosciChi)**2

    estWariancji /= float((len(listaOdleglosciChi) - 1))

    #print estWariancji


    p1 = (sredniaZodleglosciChi + 3*estWariancji)
    p2 = sredniaZodleglosciChi

    in_stream.close

    #print "gorna wartosc przedzialu ufnosci dla testu Chi-kwadrat:"
    #print "naginana, uzywana:", p2+3
    #print "teoretyczna, nieuzywana:", p1, "\n\n"

    testChi(daneDoAnalizy, wektorSrednich, wektorWariancji, p2+3, p1)


def przedzialT(daneDoAnalizy, daneUczace):

    plik = daneUczace

    try:
        in_stream = open(plik, 'r')
    except:
        print "Ostrzezenie!", "Zle zrodlo danych uczacych!\nWprowadz ponownie."

    czytaj = DictReader(in_stream, delimiter = ',')

    wektorSrednich = [0.0 for i in range(len(kddcupContinuousNames))]
    k = 0
    for pole in kddcupContinuousNames:
        r = 0
        for rekord in czytaj:
            r += 1
            if float(max(rekord[pole])) != 0.0:
                wektorSrednich[k] += float(rekord[pole])/float(max(rekord[pole]))
                #wektorSrednich[k] += float(rekord[pole])
            else:
                wektorSrednich[k] += float(rekord[pole])
        in_stream = open(plik, 'r')
        czytaj = DictReader(in_stream, delimiter = ',')
        wektorSrednich[k] /= float(r)
        k += 1

    #print wektorSrednich

    estMacierzyKowariancji = 0.0
    s = 0
    for rekord in czytaj:
        k = 0
        suma = 0.0
        for pole in kddcupContinuousNames:
            if float(max(rekord[pole])) != 0.0:
                suma += (float(rekord[pole])/float(max(rekord[pole])) - wektorSrednich[k])**2
                #suma += (float(rekord[pole]) - wektorSrednich[k])**2
            else:
                suma += (float(rekord[pole]) - wektorSrednich[k])**2
            k += 1
        estMacierzyKowariancji += suma
        s += 1
    estMacierzyKowariancji /= float(s-1)


    in_stream = open(plik, 'r')
    czytaj = DictReader(in_stream, delimiter = ',')
    listaOdleglosciT = []
    s = 0
    r = 0
    for rekord in czytaj:
        odlegloscT = 0.0
        k = 0
        for pole in kddcupContinuousNames:
            if float(max(rekord[pole])) != 0.0:
                odlegloscT += (float(rekord[pole])/float(max(rekord[pole])) - wektorSrednich[k])**2
                #odlegloscT += (float(rekord[pole]) - wektorSrednich[k])**2
            else:
                odlegloscT += (float(rekord[pole]) - wektorSrednich[k])**2
            #print float(rekord[pole])
            k += 1
        if estMacierzyKowariancji != 0:
            odlegloscT /= float(estMacierzyKowariancji)
        listaOdleglosciT += [odlegloscT]
        s += 1
        #print str(s)+",", str(rekord["signature"][:-1])+",", str(listaOdleglosciT[r])+",", "stat-T, uczace"
        r += 1

    #print "\n\n"

    sredniaZodleglosciT = 0.0
    for odleglosc in listaOdleglosciT:
        sredniaZodleglosciT += odleglosc

    sredniaZodleglosciT /= float(len(listaOdleglosciT))

    #print sredniaZodleglosciT

    estWariancji = 0.0
    for odleglosc in listaOdleglosciT:
        estWariancji += (odleglosc - sredniaZodleglosciT)**2

    estWariancji /= float(len(listaOdleglosciT) - 1)

    #print estWariancji

    p1 = (sredniaZodleglosciT + 3*estWariancji)
    p2 = sredniaZodleglosciT

    in_stream.close

    #print "gorna wartosc przedzialu ufnosci dla testu T-kwadrat:"
    #print "naginana, uzywana:", p2+3
    #print "teoretyczna, nieuzywana:", p1, "\n\n"

    testT(daneDoAnalizy, wektorSrednich, p2+3, p1)


if __name__ == "__main__":
    anomaly()

